package edu.kufpg.armatus.treelistview; import java.util.HashSet; import java.util.Set; import pl.polidea.treelistview.InMemoryTreeStateManager; import pl.polidea.treelistview.TreeBuilder; import pl.polidea.treelistview.TreeListView; import pl.polidea.treelistview.TreeNodeInfo; import pl.polidea.treelistview.TreeStateManager; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView.AdapterContextMenuInfo; import edu.kufpg.armatus.BaseActivity; import edu.kufpg.armatus.R; import edu.kufpg.armatus.util.BundleUtils; /** * Demo activity showing how the tree view can be used. * */ public class TreeListViewDemo extends BaseActivity { private static final String TAG = TreeListViewDemo.class.getSimpleName(); private static final boolean DEBUG = false; private enum TreeType { SIMPLE, FANCY } private final Set<Long> mSelected = new HashSet<Long>(); private TreeListView mTreeView; private static final int[] DEMO_NODES = new int[] { 0, 0, 1, 1, 1, 2, 2, 1, 1, 2, 1, 0, 0, 0, 1, 2, 3, 2, 0, 0, 1, 2, 0, 1, 2, 0, 1 }; private static final int LEVEL_NUMBER = 4; private TreeStateManager<Long> mManager = null; private FancyColoredVariousSizesAdapter mFancyAdapter; private SimpleStandardAdapter mSimpleAdapter; private TreeType mTreeType; private boolean mCollapsible, mRecursive; @SuppressWarnings("unchecked") @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); TreeType newTreeType = null; boolean newCollapsible; if (savedInstanceState == null) { mManager = new InMemoryTreeStateManager<Long>(); final TreeBuilder<Long> treeBuilder = new TreeBuilder<Long>(mManager); for (int i = 0; i < DEMO_NODES.length; i++) { treeBuilder.sequentiallyAddNextNode((long) i, DEMO_NODES[i]); } if (DEBUG) Log.d(TAG, mManager.toString()); newTreeType = TreeType.SIMPLE; newCollapsible = false; mRecursive = false; } else { mManager = (TreeStateManager<Long>) savedInstanceState .getSerializable("treeManager"); newTreeType = BundleUtils.getEnum(savedInstanceState, "treeType"); newCollapsible = savedInstanceState.getBoolean("collapsible"); mRecursive = savedInstanceState.getBoolean("recursive"); } setContentView(R.layout.tree_list_view_demo); mTreeView = (TreeListView) findViewById(R.id.mainTreeView); mFancyAdapter = new FancyColoredVariousSizesAdapter(this, mSelected, mManager, LEVEL_NUMBER); mSimpleAdapter = new SimpleStandardAdapter(this, mSelected, mManager, LEVEL_NUMBER); setTreeAdapter(newTreeType); setCollapsible(newCollapsible); registerForContextMenu(mTreeView); } @Override protected void onSaveInstanceState(final Bundle outState) { outState.putSerializable("treeManager", mManager); BundleUtils.putEnum(outState, "treeType", mTreeType); outState.putBoolean("collapsible", mCollapsible); super.onSaveInstanceState(outState); } protected final void setTreeAdapter(final TreeType newTreeType) { mTreeType = newTreeType; switch (newTreeType) { case SIMPLE: mTreeView.setAdapter(mSimpleAdapter); break; case FANCY: mTreeView.setAdapter(mFancyAdapter); break; default: mTreeView.setAdapter(mSimpleAdapter); } } protected final void setCollapsible(final boolean newCollapsible) { mCollapsible = newCollapsible; mTreeView.setCollapsible(mCollapsible); } @Override public boolean onCreateOptionsMenu(final Menu menu) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.tree_list_view_menu, menu); return true; } @Override public boolean onPrepareOptionsMenu(final Menu menu) { menu.findItem(R.id.expand_all_menu_item).setVisible(mCollapsible); menu.findItem(R.id.collapse_all_menu_item).setVisible(mCollapsible); menu.findItem(R.id.recursive_menu_item).setVisible(mCollapsible); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case R.id.simple_menu_item: setTreeAdapter(TreeType.SIMPLE); return true; case R.id.fancy_menu_item: setTreeAdapter(TreeType.FANCY); return true; case R.id.expand_all_menu_item: mManager.expandChildren(null, mRecursive); return true; case R.id.collapse_all_menu_item: mManager.collapseChildren(null, mRecursive); return true; case R.id.collapsible_menu_item: setCollapsible(!mCollapsible); item.setChecked(mCollapsible); return true; case R.id.recursive_menu_item: mRecursive = !mRecursive; item.setChecked(mRecursive); } return false; } @Override public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenuInfo menuInfo) { final AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo; final long id = adapterInfo.id; final TreeNodeInfo<Long> info = mManager.getNodeInfo(id); final MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.tree_list_view_context_menu, menu); if (info.isWithChildren() && mCollapsible) { if (info.isExpanded()) { menu.findItem(R.id.context_menu_expand_item).setVisible(false); menu.findItem(R.id.context_menu_expand_all).setVisible(false); } else { menu.findItem(R.id.context_menu_collapse_item).setVisible(false); menu.findItem(R.id.context_menu_collapse_all).setVisible(false); } } else { menu.findItem(R.id.context_menu_expand_item).setVisible(false); menu.findItem(R.id.context_menu_expand_all).setVisible(false); menu.findItem(R.id.context_menu_collapse_item).setVisible(false); menu.findItem(R.id.context_menu_collapse_all).setVisible(false); } super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(final MenuItem item) { final AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); final long id = info.id; switch (item.getItemId()) { case R.id.context_menu_expand_item: mManager.expandChildren(id, false); return true; case R.id.context_menu_expand_all: mManager.expandChildren(id, true); return true; case R.id.context_menu_collapse_item: mManager.collapseChildren(id, false); return true; case R.id.context_menu_collapse_all: mManager.collapseChildren(id, true); return true; case R.id.context_menu_delete: mManager.removeNodeRecursively(id); return true; } return super.onContextItemSelected(item); } }